/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.česky.oopnz.utility;



////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu - prostor pro importy +++++

//%X+ xxxxx Začátek přeskakovaného textu s deklarací obalové třídy xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu s deklarací obalové třídy -----


/*******************************************************************************
 * Instance třídy {@code Pozice} představují přepravky uchovávající informace
 * o pozici objektu.
 * Proto jsou jejich atributy deklarovány jako veřejné konstanty.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Pozice
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Vodorovná souřadnice. */
    public final int x;

    /** Svislá souřadnice. */
    public final int y;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří přepravku uchovávající zadané souřadnice.
     *
     * @param x  Vodorovná souřadnice
     * @param y  Svislá souřadnice
     */
    public Pozice( int x, int y )
    {
        this.x = x;
        this.y = y;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí uloženou velikost vodorovné souřadnice.
     *
     * @return  Požadovaná hodnota
     */
    public int getX()
    {
        return x;
    }


    /***************************************************************************
     * Vrátí uloženou velikost svislé souřadnice.
     *
     * @return  Požadovaná hodnota
     */
    public int getY()
    {
        return y;
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//%A+ >127

    /***************************************************************************
     * Vrátí informaci o tom, představuje-li instance zadaná v parametru
     * stejnou pozici.
     *
     * @param  o   Testovaná instance
     * @return Je-li zadaná instance pozicí se stejnými hodnotami atributů,
     *         vrátí {@code true}, jinak vrátí {@code false}.
     */
    @Override
    public boolean equals( Object o )
    {
//%A-
//%I+ >127 -135
//        return (o instanceof Pozice)      &&
//               (((Pozice)o).x == this.x)  &&
//               (((Pozice)o).y == this.y);
//%I-
//%A+ >135
        if( ! (o instanceof Pozice) ) {
            return false;               //==========>
        }
        Pozice p = (Pozice)o;
        return (p.x == x) && (p.y == y);
//%A-
//%A+ >127
    }

//%A-
//%X+ <999

    /***************************************************************************
     * Vrátí heš-kód dané instance.
     *
     * @return  Heš-kód
     */
    @Override
    public int hashCode()
    {
        return 1234567 + 37*(37*x + y);
    }

//%X-
//%X+ <126

    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Podpis dané instance
     */
    @Override
    public String toString()
    {
        return "Pozice[x=" + x + ", y=" + y + "]";
    }

//%X-
//%X+ <999

    /***************************************************************************
     * Vrátí novou pozici vzniklou z této pozice po přesunu
     * o zadaný počet bodů vodorovně a svisle.
     *
     * @param  dx   Vodorovná vzdálnost přesunu (>0=zvětšit, <0=zmenšit)
     * @param  dy   Svislá vzdálnost přesunu (>0=zvětšit, <0=zmenšit)
     * @return Pozice po zadaném přesunu
     */
    public Pozice přesunO( int dx, int dy )
    {
        return new Pozice( x+dx, y+dy );
    }


    /***************************************************************************
     * Vrátí novou pozici vzniklou z této pozice po přesunu
     * o zadaný počet bodů vodorovně a svisle.
     *
     * @param vzdálenost  Relativní pozice vůči dané pozici - její atributy
     *                    určují vzdálnosti potřebné k přesunu
     * @return Pozice po zadaném přesunu
     */
    public Pozice přesunO(Pozice vzdálenost)
    {
        return new Pozice( x+vzdálenost.x, y+vzdálenost.y );
    }


    /***************************************************************************
     * Vrátí vzdálenost od této pozici k zadané pozici.
     *
     * @param  pozice  Pozice, k níž se zjišťuje vzdálenost
     * @return Zjišťovaná vzdálenost
     */
    public double vzdálenostK( Pozice pozice )
    {
        return Math.hypot( x-pozice.x, y-pozice.y );
    }

//%X-
//%X+ <126


//%X-
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Pozice inst = new Pozice();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
